#!/usr/bin/env python
# -*- coding:utf-8 -*-


def is_odd(n):
    return n % 2 == 1


def not_empty(s):  # 把一个序列中的空字符串删掉
    return s and s.strip()


def reversed_cmp(x, y):
    if x > y:
        return -1
    if x < y:
        return 1
    return 0


def f(x):
    return x * x


def add(x, y):
    return x + y


def fn(x, y):  # 数字序列变整数
    return x * 10 + y


def str2int(s):
    def fn(x, y):
        return x * 10 + y

    def char2num(s):
        return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]

    return reduce(fn, map(char2num, s))  # reduce map的融合


if __name__ == '__main__':
    print filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])  # filter()函数用于过滤序列。是一个筛选函数，filter()接收一个函数和一个序列
    # 和map()类似，filter()也接收一个函数和一个序列。和map()不同的时，filter()把传入的函数依次作用于每个元素，然后根据返回值是True还是False决定保留还是丢弃该元素。
    print filter(not_empty, ['A', '', 'B', None, 'C', '  '])
    print sorted([36, 5, 12, 9, 21])
    print sorted([36, 5, 12, 9, 21], reversed_cmp)  # 自定义比较函数
    print map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])  # map()函数接收两个参数，一个是函数，一个是序列，map将传入的函数依次作用到序列的每个元素，并把结果作为新的list返回
    print reduce(add, [1, 3, 5, 7, 9])
    print reduce(fn, [1, 3, 5, 7, 9])  # reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)   map 从一个列表到另一个列表的计算
    print str2int('1236548')
